import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;


public class Administrateur extends JFrame {
	
	ArrayList<PanelNoeud> listePanelsNoeuds;
	static Administrateur instance = null;
	
	// Elements de l'interface graphique 
	JButton jstart = new JButton("Générer");
	JButton jstop = new JButton("Arrêter");
	
	JPanel panelMain = new JPanel();
	JPanel panelLauch = new JPanel();
	
	JScrollPane panelScrollListe = new JScrollPane();
	JPanel panelListe = new JPanel();
	
	final JSpinner spinNbNoeuds = new JSpinner();
	
	// Acces à l'instance de l'Administrateur
	public static Administrateur getInstance(){
		if(instance == null){
			instance = new Administrateur();
		}
		return instance;
	}
	
	// Constructeur de l'Administrateur
	private Administrateur() {
		createInstance();
	}

	
	// Création de l'instance
	private void createInstance() {
		setTitle("Console administrateur");
		setSize(550,400);
		
		listePanelsNoeuds = new ArrayList<PanelNoeud>();
		
		// Par defaut, le nombre de noeud est fixé à 2
		spinNbNoeuds.setValue(2);
		spinNbNoeuds.setPreferredSize(new Dimension(40, 20));
		
		// Comportement lors de l'appui sur le bouton start
		jstart.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				if(Integer.parseInt(spinNbNoeuds.getValue().toString()) < 2)
				{
					spinNbNoeuds.setValue(2);
				}
				creerNoeuds(Integer.parseInt(spinNbNoeuds.getValue().toString()));
				Administrateur.getInstance().autoriserStart(false);	
			}
		});
		
		// Comportement lors de l'appui sur le bouton stop
		jstop.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				Administrateur.getInstance().autoriserStart(true);		
				Administrateur.getInstance().viderPanel();
			}
		});
		
		autoriserStart(true);
		
		getContentPane().add(panelMain);
		
		panelMain.setLayout(new BorderLayout());
		panelMain.add(panelLauch, BorderLayout.NORTH);
		panelMain.add(panelScrollListe, BorderLayout.CENTER);
		panelScrollListe.getViewport().add(panelListe);
		getContentPane().add(panelMain);
				
		panelLauch.add(new JLabel("Nombre de noeuds : "));
		panelLauch.add(spinNbNoeuds);
		panelLauch.add(jstart);
		panelLauch.add(jstop);
		
		panelListe.setLayout(new BoxLayout(panelListe, BoxLayout.Y_AXIS));
		
		// Affichage de la fenêtre
		setVisible(true);
		// Comportement a la suppression
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}
	
	//Methode gestion des boutons principaux
	public void autoriserStart(boolean b)
	{
			jstart.setEnabled(b);
			jstop.setEnabled(!b);
			spinNbNoeuds.setEnabled(b);
	}
	
	//Methode pour vider le panel principal
	public void viderPanel()
	{
		panelListe.removeAll();
		panelListe.updateUI();
		// Remise à zéro des listes
		listePanelsNoeuds = new ArrayList<PanelNoeud>();
	}

	
	// Methode pour creer n noeuds
	private void creerNoeuds(int nbNoeuds){		
		// Création de nbNoeuds Noeuds
		for(Integer i=0; i<nbNoeuds; i++)
		{
			listePanelsNoeuds.add(new PanelNoeud(i, nbNoeuds));
			PanelNoeud panelNoeud = listePanelsNoeuds.get(i);
			panelListe.add(panelNoeud);		
			setVisible(true);
		}		
		// Initialisation des noeuds
		for(Integer i=0; i<nbNoeuds; i++)
		{
			listePanelsNoeuds.get(i).init();
		}
	}
	
	public void interdireSelectionPeres(){
		Iterator<PanelNoeud> i = listePanelsNoeuds.iterator();
		while(i.hasNext()){
			i.next().autoriserSelectionPere(false);
		}
	}
	
	public NoeudInterface getNoeud(Integer id){
		return listePanelsNoeuds.get(id).getNoeud();
	}
	
	// Point d'entrée du programme
	public static void main(String args[]) {		
		System.out.println("Lancement de l'Administrateur");
		Administrateur.getInstance();
	}	
	

}
